OV reisinformatie voor nerds: Deel 1
Joel Haasnoot – Vrijwilliger NDOVLoket
Anno 2016 is de wereld van openbaar vervoer enorm open: heel veel data wordt gedeeld door de OV-bedrijven volgens Nederlandse standaarden. Vandaag heet ik je welkom in de wereld van bus, tram en metro (grofweg: veerboten soms ook). Trein behandelen we in een andere blogpost, dat is namelijk een compleet andere wereld.
OV-Vervoerders delen reisinformatie meestal omdat dit verplicht wordt door opdrachtgevers. Het proces om deze data vrij te peuteren duurt vele jaren, over veel lichtingen aanbestedingen heen. Het is niet makkelijk om overheden, vervoerders en leveranciers allemaal samen te laten werken. De data wordt geleverd volgens standaarden die we in Nederland hebben opgezet. Deze standaarden heten koppelvlakken en zijn gemaakt door de vervoerders en leveranciers, verenigd in werkgroep Bison, onderdeel van de organisatie Connekt.
Elk koppelvlak is gemaakt voor een ander stukje of type data en heeft een nummertje gekregen. De laatste versie van elke standaard staat op de site van Bison, hier. Hierbij even een bloemlezing met wat elk koppelvlak doet en wat je in de praktijk tegenkomt. Ik ga het niet in de juiste volgorde doen, omdat sommige standaarden in de praktijk niet publiek zijn of niet worden gebruikt:
Koppelvlak 1 (KV1)
Dit is de dienstregeling of planning van een vervoerder zoals deze van te voren wordt gepland. Dat wil zeggen: alle lijnen waar bussen, trams of metro’s op rijden, de haltes waar ze stoppen, op welke dagen en op welke tijden ze rijden en nog meer. Dat nog meer is onder andere: bestemmingen, lijnkleuren, wie de lijn betaalt (welke overheid), en hoe de bus rijdt. In de praktijk is dit niet voor het hele jaar zoals je in een busboekje vindt maar een aantal weken vooruit, inclusief de geplande uitzonderingen. Over uitzonderingen en hoe die wel en niet werken volgt nog een keer een blog.
Qua bestand is KV1 een collectie verschillende CSV bestanden of tabellen die allemaal net iets andere data bevatten. De standaard legt uit welke velden hierin verplicht zijn of niet en wat er in welk veld moet staan.
De praktijk is helaas wel iets lastiger omdat veel vervoerders het allemaal net even anders doen. KV1 inlezen van een vervoerder is makkelijk, maar er zijn dus nogal wat uitzonderingen. KV1 wordt door partijen als OVapi ook omgezet naar Google Transit Feed Specification, GTFS: dat is voor een starter makkelijker mee te werken (212MB: je wilde alles toch?). Over de GTFS standaard volgende keer meer.
KV6
Bijna elke bus heeft tegenwoordig een GPS apparaat en die posities sturen vervoerders door met 3 of 4G verbindingen. Niet alleen om zelf de bussen te kunnen beheren, maar ook voor reisinformatie door, jawel, koppelvlakken. Een bus die rijdt levert dus XML-berichtjes op met daarin informatie over de status van een busrit. Dat is dus een rit die in KV1 gepland is.
De berichtjes worden verstuurd aan de hand van bepaalde gebeurtenissen: onder andere voor het begin van een rit, het aankomst en vertrek op een bushalte, het rijden van de route tussen die haltes, het afwijken van de geplande route en tenslotte het einde van de rit. De meeste van deze berichten bevatten ook de GPS posities, maar niet elk bericht bevat die informatie.
Met KV1 en KV6 kan je ook je eigen actuele reisinformatiesysteem bouwen, en dat is precies wat de overheden dan ook hebben gedaan om de displays bij bushaltes aan te sturen (in OV-jargon heet zo’n scherm een DRIS). OVInfo (op iOS en Android) doet dit zelf ook, maar gebruikt de informatie bijvoorbeeld voor ovradar.nl, om te tonen waar de bussen rijden op dit moment. Je kan de real-time stroom van XML-berichtjes ontvangen via het NDOV-loket, hoe dat gaat vertellen we volgende keer.
KV17
Goed, dus we hebben nu bussen die rijden volgens een dienstregeling (KV1) op een bepaalde plek (KV6). Maar wat als dat nu eens niet het geval is, bijvoorbeeld door een ongeluk, staking of ander probleem? Dan stuurt de vervoerder met KV17 een berichtje om aan te kondigen dat de rit niet meer rijdt. Of als dan even later de bus toch rijdt, kan dat ook.
Er zitten in deze standaard nog wat andere mogelijkheden, bijvoorbeeld haltes die niet worden aangedaan of een rit die half rijdt. In de praktijk zijn die berichten nog niet echt wijdverspreid, vooral Connexxion gebruikt die mogelijkheden.
KV15
En wat als er wat anders gebeurt dat nu of in de toekomst belangrijk is voor klanten? Vervoerders kunnen met KV15 een semi-gestructureerd bericht sturen met informatie. Vaak zie je deze op de bushalte in de vorm van een scrollend bericht of een app als waarschuwing. Ik zeg semi-gestructureerd omdat er 255 tekens vrije tekst in kan, ondersteund door een aantal vaste waardes over het bericht (zoals de oorzaak, gevolg, etc.). Deze berichten hebben ook een begin- en einddatum en tijd en worden verstuurd per halte.
KV7/8
Om te communiceren over de geplande info in de actuele situatie zijn KV7 en KV8 in het leven geroepen. Dit wordt met name gebruikt om de DRIS-schermen aan te sturen, maar je kan dit ook gebruiken om actuele vertrektijden te maken. Iemand heeft in dat geval namelijk al het klusje voor je gedaan om KV1, KV6, KV17 en KV15 te combineren. In het geval van OpenOV kan je dit afnemen in het iet wat bizarre formaat “KV78turbo”, waarbij je realtime berichten gepushed krijgt als afnemer. De berichten hebben een soort CSV formaat. Er is een wat verouderde voorbeeld implementatie is open source beschikbaar op Github (hij is wel lastig te installeren).
KV19
Deze ga je in de praktijk niet echt tegenkomen: de enige actieve gebruiker is 9292. Het is een manier om vertrektijden te publiceren naar displays en schermen. Voor meer info zal je de specificatie en Bison architectuur moeten lezen (en dat is sowieso een goed idee).
KV4/5
Dit gaat over het toewijzen van bussen aan perrons. Bijvoorbeeld het busstation in Leiden kunnen de bussen stoppen aan een ander perron als het druk is, of juist niet. Er zijn weinig andere voorbeelden van dit soort busstations, dus wordt het ook niet veel gebruikt. Ook wordt deze informatie nog niet publiek beschikbaar gesteld, maar het zou in de toekomst wel handig kunnen zijn om aan reizigers te vertellen op welk perron de bus straks stopt – wanneer dit dynamisch wordt gewezen, in plaats van in de dienstregeling staat.
Goed, dat was het voor nu. De laatste paar standaarden in de tabel zijn grotendeels “niet van toepassing” – ze worden niet actief toegepast of zijn niet publiek beschikbaar. Volgende keer gaan we verder met welke andere tools en standaarden handig zijn. Voor aflevering drie staan de informatiebronnen van treinen op de rol.